// 引入 axios 包
import axios from 'axios'
// 引入 仓库实例，用于获取token
import store from '@/store'
// 进入 路由实例，用于跳转页面
import router from '@/router'

import { Toast } from 'vant'

// export const baseURL = 'http://192.168.5.107'
export const baseURL = 'https://gy365.cn/'

// 创建 axios 实例
const instance = axios.create({
  baseURL, // baseURL: baseURL 配置请求基地址
  timeout: 50000 // 请求5s超时
})

// 请求拦截器
instance.interceptors.request.use(
  config => {
    // 获取仓库中的用户数据
    if(store.state.user){
      const { profile } = store.state.user
      // 如果有 token
      if (profile.token) {
        // 把 token 信息添加到请求头中
        config.headers['user-token'] = profile.token
        // config.headers.Authorization = `Bearer ${profile.token}`
      }
    }

    
    Toast.loading({
      message: '加载中...',
      forbidClick: true,
      duration: 0,
      loadingType: 'spinner',
    });
    
    // 返回加工后的配置，用于发送请求
    return config
  },
  err => {
    // 用于 catch 捕获错误信息
    return Promise.reject(err)
  }
)

// 是否正在刷新的标记
// let isRefreshing = false
// 重试队列，每一项将是一个待执行的函数形式
// let requests = []

// 响应拦截器
instance.interceptors.response.use(
  // 请求成功后，返回 res.data
  res => {
    if (res.data.code === 0) {
      res.data.msg && Toast(res.data.msg)
      return Promise.reject(res.data)
    } else if (res.data.code === -1) {
      Toast.clear()
      store.commit('user/clearInfo')
      Toast('请先登入')
      const fullPath = encodeURIComponent(router.currentRoute.fullPath)
      // 跳转到登录页并携带回调地址
      router.push('/user?redirectUrl=' + fullPath)
      
      return Promise.reject(res.data)
    }
    Toast.clear()
    return res.data
  },
  // 处理错误
  err => {
    // 后端状态码 401 表示用户信息无效(token无效)
    if (err.response && err.response.status === 401) {
      // 清空无效用户信息
      store.commit('user/setUser', {})
      // router.currentRoute  获取当前路由实例(ref响应式对象，所以获取数据的时候要多个.value)
      // fullPath 路由的完整路径(包括路由参数)
      // encodeURIComponent() 特殊符号转码，路径兼容性更好
      const fullPath = encodeURIComponent(router.currentRoute.value.fullPath)
      // 跳转到登录页并携带回调地址
      router.push('/user?redirectUrl=' + fullPath)
    }
    Toast.clear()
    // 用于 catch 捕获错误信息
    return Promise.reject(err)
  }
)

// 发送请求的时候，再翻译这里封装的函数
const request = (url, method = 'get', submitData) => {
  return instance({
    url: url,
    method,
    [method.toLowerCase() === 'get' || !method ? 'params' : 'data']: submitData
  })
}

export default request
